#include "TCola.h"

int Cola_Crear(TCola* cola, int tam_dato)
{
   cola->primero = cola->ultimo = NULL;
   cola->tam_elem = tam_dato;
   return COLA_OK;
}

int Cola_Vaciar(TCola* cola)
{
   TNodoPilaCola* aux = cola->primero;
   TNodoPilaCola* siguiente;
   while (aux)
   {
      siguiente = aux->siguiente;
      free(aux->elemento);
      free(aux);
      aux = siguiente;
   }

   cola->primero = cola->ultimo = NULL;
   return COLA_OK;
}

int Cola_Vacia(TCola cola)
{
   return !(cola.primero);
}

int Cola_Agregar(TCola* cola, void* elemento_in) {
	TNodoPilaCola* nodo = (TNodoPilaCola*) malloc(sizeof(TNodoPilaCola));
	if (!nodo)
		return COLA_ERR_MEMORIA;
	else
	{
		if (cola->ultimo) {
			cola->ultimo->siguiente = nodo;
		}

		if (!cola->primero) {
			cola->primero = nodo;
		}

		nodo->siguiente = NULL;
		cola->ultimo = nodo;
		nodo->elemento = malloc(cola->tam_elem);
		memcpy(nodo->elemento, elemento_in, cola->tam_elem);
		return COLA_OK;
	}
}

int Cola_Sacar(TCola* cola, void* elemento_out)
{
	TNodoPilaCola* aux = cola->primero;

	if (Cola_Vacia(*cola)) {
		return COLA_ERR_VACIA;
	}

	cola->primero = cola->primero->siguiente;
	if (!cola->primero) {
		cola->ultimo = NULL;
	}

	memcpy(elemento_out, aux->elemento, cola->tam_elem);
	free(aux->elemento);
	free(aux);

	return COLA_OK;
}
